/**
 * 标题：自定义日志存储在txt中
 * 说明：
1. 自定义日志存储在txt中
2. 生成的文件存放在对应app目录下的 _doc/logs 文件夹中
··· js
// main.js 文件进行全局挂载
// 引入logger
import logger from  '@/components/libs/logger.js'
// 挂载logger
uni.$console = logger;
```
...
 * 使用方法 *********************************************
 * 1. 使用全局挂载的方式(和console)一致
 * uni.$console.debug('日志信息');
 * uni.$console.log('日志信息');
 * uni.$console.info('日志信息');
 * uni.$console.warn('日志信息');
 * uni.$console.error('日志信息');
 
 * 2. 在普通js文件单独引入的方法
 * import logger from '@/path/to/the/logger.js'
 * logger.log('日志信息')
 * logger.error('日志信息')
 
 */

// 日志存放的文件夹目录
const LOG_DIR = '_doc/logs'
/**
 * 获取当前时间
 */
function getDayStr() {
  let y, m, d, h, mm, s
  const date = new Date()
  y = date.getFullYear()
  m = date.getMonth() + 1
  d = date.getDate()
  m = m < 10 ? `0${m}` : m
  d = d < 10 ? `0${d}` : d
  // //console.log('日期:',y,m,d)
  // return '20220607' // 生成指定日期
  return `${y}${m}${d}`
}
/**
 * 获取当前时间，yyyy-mm-dd hh:mm:ss
 * 用于记录日志的时间信息
 */
function getTimeStr() {
  let y, m, d, h, mm, s
  const date = new Date()
  y = date.getFullYear()
  m = date.getMonth() + 1
  d = date.getDate()
  h = date.getHours()
  mm = date.getMinutes()
  s = date.getSeconds()
  m = m < 10 ? `0${m}` : m
  d = d < 10 ? `0${d}` : d
  h = h < 10 ? `0${h}` : h
  mm = mm < 10 ? `0${mm}` : mm
  s = s < 10 ? `0${s}` : s
  const timeStr = `${y}-${m}-${d} ${h}:${mm}:${s}`
  return timeStr
}
/**
 * 日志TXT的名称
 */
function getLogFileName() {
  const txt = `${LOG_DIR}/${getDayStr()}.txt`
  // //console.log('TXT文件名称:',txt)
  return txt
}
let tasks = []
/**
 * @param {object} tag 标识
 * @param {object} msg 空格
 */
function writeToTxt(tag) {
  return new Promise((resolve, reject) => {
    let msgs = ''
    for (let i = 1; i < arguments.length; i++) {
      const item = arguments[i]
      if (
        typeof item == 'string'
        || typeof item == 'number'
        || typeof item == 'boolean'
      ) {
        msgs = `${msgs}\t${item}`
      }
      else {
        msgs = `${msgs}\t${JSON.stringify(item)}`
      }
    }
    // 获取当前时间
    const txt_msg = `${getTimeStr()}\t[${tag}]\t${msgs}\n`
    if (tag == 'ERROR') {
      console.error(txt_msg)
    }
    else {
      // //console.log(txt_msg);
    }
    tasks.push(txt_msg)
    resolve(true)
  }).then(() => {
    clearTask()
  })
}
// 清空日志到日志文件
function clearTask() {
  // #ifdef APP-PLUS
  if (tasks.length === 0) {
    return
  }
  const txt_msg = tasks.join('')
  tasks = []
  const fileName = getLogFileName()
  plus.io.requestFileSystem(
    plus.io.PRIVATE_DOC,
    (fs) => {
      fs.root.getFile(
        fileName,
        {
          create: true,
        },
        (entry) => {
          // 写入到本地
          entry.createWriter(
            (writer) => {
              writer.onwrite = function (e) {
                // console.log("Write data success!");
                console.log('写入本地日志 >>>> ', txt_msg)
              }
              writer.onerror = function (e) {
                console.eror(
                  '写入本地日志失败 >>>> ',
                  JSON.stringify(e),
                  txt_msg,
                )
              }
              // Write data to the end of file.
              writer.seek(writer.length)
              writer.write(txt_msg)
            },
            (e) => {
              console.log(e.message)
            },
          )
        },
      )
    },
    (e) => {
      console.log(`Request file system failed: ${JSON.stringify(e)}`)
    },
  )
  // #endif
}

/**
 * 压缩所有的日志为zip
 */
function zipLogDir(callback) {
  // console.log('开始压缩');
  // #ifdef APP-PLUS
  const zipFile = '_doc/logs.zip'
  const targetPath = LOG_DIR

  // 开始压缩文件
  console.log('开始压缩', targetPath, zipFile)
  plus.zip.compress(
    targetPath,
    zipFile,
    (res) => {
      console.log('开始压缩 Compress success!', res)
      if (callback) {
        callback({
          success: true,
          res,
          zipPath: zipFile,
        })
      }
    },
    (error) => {
      console.error('开始压缩 Compress error!', error)
      if (callback) {
        callback({
          success: false,
          error,
        })
      }
    },
  )
  // #endif
}
/**
 * 删除多少天之前的日志文件
 */
function removeFile(durationDay) {
  return new Promise((resolve, reject) => {
    if (!durationDay || durationDay <= 0) {
      durationDay = 10
    }
    const dirPath = LOG_DIR
    plus.io.resolveLocalFileSystemURL(
      dirPath,
      (entry) => {
        // 读取这个目录对象
        const directoryReader = entry.createReader()
        // console.log(dirPath)
        // 读取这个目录下的所有文件
        directoryReader.readEntries(
          (entries) => {
            console.log('日志文件数量', entries.length)
            // 如果有才操作
            if (entries.length > 0) {
              const now = getDayStr()
              for (const file of entries) {
                // console.log(file.name);
                // 判断需要保留的日志
                const day = file.name.replace('.txt', '')
                // console.log(parseInt(day) + parseInt(durationDay) < parseInt(now));
                // console.log(parseInt(day));
                // console.log(parseInt(durationDay));
                // console.log(parseInt(day) + parseInt(durationDay));
                // console.log(parseInt(now));
                if (Number.parseInt(day) + Number.parseInt(durationDay) < Number.parseInt(now)) {
                  console.log('需要删除的日志是', file.name)
                  try {
                    file.remove(
                      () => {
                        console.error('删除日志成功', file.name)
                      },
                      (e) => {
                        console.error('删除日志失败', file.name, e)
                      },
                    )
                  }
                  catch (e) {
                    console.error('删除日志失败', file.name, e)
                  }
                }
                else {
                  console.log('保留的日志是', file.name)
                }
              } // for
            } // if
            resolve()
          },
          (e) => {
            console.log(`读取文件失败：${e.message}`)
            resolve()
          },
        )
      },
      (e) => {
        console.log(`读取目录失败：${e.message}`)
        resolve()
      },
    )
  })
}

/**
 * 自定义TXT日志
 */
const logger = {
  /**
   * @param {object} msg 日志信息的字符串信息
   */
  debug() {
    writeToTxt('DEBUG', ...arguments)
    console.debug(...arguments)
  },
  log() {
    writeToTxt('LOG', ...arguments)
    console.log(...arguments)
  },
  info() {
    writeToTxt('INFO', ...arguments)
    console.info(...arguments)
  },
  warn() {
    writeToTxt('WARN', ...arguments)
    console.warn(...arguments)
  },
  error() {
    writeToTxt('ERROR', ...arguments)
    console.error(...arguments)
  },
  /**
   * @param {string} tag 日志信息的自定义信息
   */
  tag(tag) {
    writeToTxt(tag, ...arguments)
    console.log(...arguments)
  },
  /**
   * @param {object} msg 日志信息的字符串信息
   */
  network() {
    writeToTxt('NETWORK', ...arguments)
    console.log(...arguments)
  },
  /**
   * @param {object} msg 日志信息的字符串信息
   */
  logIpExchange(msg) {
    writeToTxt('IpExchange', ...arguments)
    console.log(...arguments)
  },
  /**
   * 压缩成zip，并返回路径
   * @param {object} callback
   */
  zipLogDir,
  /**
   * 删除多少${durationDay}天之前的日志文件
   * @param {object} durationDay 默认是10天
   */
  removeFile,
  /**
   * 主要使用方法。先移除
   * @param {object} callback
   */
  removeFileAndZipLogDir(callback) {
    removeFile().then(() => {
      zipLogDir(callback)
    })
  },
}

export default logger
